# 重置索引（reindex）可以更改原 DataFrame 的行标签或列标签，并使更改后的行、列标签与 DataFrame 中的数据逐一匹配。
# 通过重置索引操作，您可以完成对现有数据的重新排序。
# 如果重置的索引标签在原 DataFrame 中不存在，那么该标签对应的元素值将全部填充为 NaN。
import pandas as pd
import numpy as np

# 重置行列标签 reindex  reindex_like  rename
N = 20
df = pd.DataFrame({
    'A': pd.date_range(start='2016-01-01', periods=N, freq='D'),
    'x': np.linspace(0, stop=N - 1, num=N),
    'y': np.random.rand(N),
    'C': np.random.choice(['Low', 'Medium', 'High'], N).tolist(),
    'D': np.random.normal(100, 10, size=(N)).tolist()
})
print(df)
#             A     x         y       C           D
# 0  2016-01-01   0.0  0.782928     Low   93.522191
# 1  2016-01-02   1.0  0.964717  Medium  102.753295
# 2  2016-01-03   2.0  0.991068  Medium  112.678003
# 3  2016-01-04   3.0  0.309015  Medium  106.640704
# 4  2016-01-05   4.0  0.035070    High   96.302709
# 5  2016-01-06   5.0  0.545705  Medium  110.050672
# 6  2016-01-07   6.0  0.774262    High   98.225674
# 7  2016-01-08   7.0  0.184018     Low  110.509868
# 8  2016-01-09   8.0  0.828660     Low   85.219085
# 9  2016-01-10   9.0  0.734713    High   83.922278
# 10 2016-01-11  10.0  0.221629  Medium  100.086418
# 11 2016-01-12  11.0  0.973378    High   94.020181
# 12 2016-01-13  12.0  0.818996    High   97.864486
# 13 2016-01-14  13.0  0.582836  Medium   88.839412
# 14 2016-01-15  14.0  0.180586  Medium   87.609589
# 15 2016-01-16  15.0  0.416299     Low  102.768655
# 16 2016-01-17  16.0  0.301526    High  110.900364
# 17 2016-01-18  17.0  0.171520  Medium   97.924594
# 18 2016-01-19  18.0  0.364564  Medium  100.903982
# 19 2016-01-20  19.0  0.625326    High   96.867637
# 重置行、列索引标签
df_reindexed = df.reindex(index=[0, 2, 5], columns=['A', 'C', 'B'])
print(df_reindexed)
#            A       C   B
# 0 2016-01-01     Low NaN
# 2 2016-01-03  Medium NaN
# 5 2016-01-06  Medium NaN

# 现有 a、b 两个 DataFrame 对象，如果想让 a  的行索引与 b 相同，您可以使用 reindex_like() 方法
a = pd.DataFrame(np.random.randn(10, 3), columns=['col1', 'col2', 'col3'])
b = pd.DataFrame(np.random.randn(7, 3), columns=['col1', 'col2', 'col3'])
a = a.reindex_like(b)
# a 会按照 b 的形式重建行索引。需要特别注意的是，a 与 b 的列索引标签必须相同。
print(a)

# 填充元素值
# reindex_like() 提供了一个可选的参数method，使用它来填充相应的元素值
# pad/ffill：向前填充值；
# bfill/backfill：向后填充值；
# nearest：从距离最近的索引值开始填充。
print(a.reindex_like(b, method='ffill'))  # 向前填充
# 限制填充行数
print(a.reindex_like(b, method='ffill', limit=2))

# 重命名标签 rename
# rename() 方法允许您使用某些映射(dict或Series)或任意函数来对行、列标签重新命名
# 对行和列重新命名
print(a.rename(columns={'col1': 'c1', 'col2': 'c2'}, index={0: 'apple', 1: 'banana', 2: 'durian'}))
#               c1        c2      col3
# apple   1.117061  1.151161 -1.112880
# banana  0.448062  0.503301  0.183292
# durian  0.269959 -0.041341  1.560238
# 3      -1.199715  0.133636  0.906552
# 4      -0.974018 -1.710544 -0.752234
# 5       0.159214 -1.167676 -0.668985
# 6      -0.478517  1.281161  1.675187

# rename() 方法提供了一个 inplace 参数，默认值为 False，表示拷贝一份原数据，并在复制后的数据上做重命名操作。
# 若 inplace=True 则表示在原数据的基础上重命名。
